home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
6647
/
6647.xpi
/
chrome
/
httpfox.jar
/
content
/
HttpFox.js
< prev
next >
Wrap
Text File
|
2009-04-10
|
37KB
|
1,246 lines
/*
HttpFox - An HTTP analyzer addon for Firefox
Copyright (C) 2008 Martin Theimer
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
// HttpFoxController
function HttpFoxController()
{
this.init();
}
HttpFoxController.prototype =
{
HttpFoxService: null,
RequestTree: null,
SelectedRequestDetailsTab: null,
IntervalChecker: null,
QuickFilterText: "",
FilteredRequests: null,
WindowMode: null,
PostDataViewMode: 0,
ContentViewMode: 0,
XMLPrettyPrintXSLT: null,
// constructor
init: function()
{
this.FilteredRequests = new Array();
this.HttpFoxService = Components.classes["@decoded.net/httpfox;1"].getService().wrappedJSObject;
this.loadXMLPrettyPrintXSL();
},
initGraphics: function(wmode)
{
this.WindowMode = wmode;
this.clearRequestTree();
this.clearRequestInfoTabs();
this.selectionChange_ContentDisplayTypePretty();
this.selectionChange_PostDataDisplayTypePretty();
if (!this.HttpFoxService.Preferences.ShowDebugTab)
{
document.getElementById("hf_DebugTabHeader").collapsed = "true";
document.getElementById("hf_DebugTabHeader").disabled = "true";
}
this.HttpFoxService.addController(this);
this.initFilteredRequests(this.HttpFoxService.Requests);
if (this.HttpFoxService.IsWatching)
{
this.disableButton_startWatching();
}
this.RequestTree.setCurrentToNewest();
if (this.WindowMode)
{
this.HttpFoxService.HttpFoxWindow = this;
document.getElementById("hf_TopBarButton_Detach").collapsed = true;
document.getElementById("hf_TopBarButton_Detach").disabled = true;
}
},
loadXMLPrettyPrintXSL: function()
{
var xslDoc = document.implementation.createDocument("", "", null);
xslDoc.async = false;
// default xsl from firefox
//xslDoc.load("chrome://global/content/xml/XMLPrettyPrint.xsl");
var test = xslDoc.load("chrome://httpfox/content/XMLPrettyPrint.xsl");
var processor = new XSLTProcessor();
processor.importStylesheet(xslDoc);
this.XMLPrettyPrintXSLT = processor;
},
cmd_hf_showAbout: function()
{
alert("HttpFox");
},
//C BUTTON
onClickStatusIcon: function(event)
{
if (event.button != 0)
{
return;
}
else
{
this.cmd_hf_togglePanel();
}
},
cmd_hf_close: function()
{
if (this.WindowMode)
{
// close button in detached window
window.close();
}
else
{
this.cmd_hf_togglePanel();
}
},
//G
cmd_hf_togglePanel: function()
{
var HttpFoxPanel = document.getElementById("hf_PanelNormal");
var HttpFoxPanelSplitter = document.getElementById("hf_PanelSplitter");
// if already opened detached, switch to opened window
if (this.switchToDetachedWindowIfOpened())
{
return;
}
// if always open detached, open detached
if (this.HttpFoxService.Preferences.AlwaysOpenDetached)
{
this.cmd_hf_detach();
return;
}
this.togglePanel();
},
//C INPUT
cmd_hf_quickFilterChanged: function()
{
var sb = document.getElementById("hf_QuickFilterBox");
this.QuickFilterText = sb.value;
this.applyFilter();
},
setFocus: function()
{
window.focus();
},
//CG
applyFilter: function()
{
this.FilteredRequests = new Array();
for (var i = 0; i < this.HttpFoxService.Requests.length; i++)
{
if (this.HttpFoxService.Requests[i].Url.indexOf(this.QuickFilterText) != -1)
{
// filter matched
this.FilteredRequests.push(this.HttpFoxService.Requests[i]);
}
}
this.clearRequestTree();
this.clearRequestInfoTabs();
},
isAutoScroll: function()
{
return document.getElementById("hf_AutoScrollCheckbox").checked;
},
filterRequest: function(parameterArray)
{
var request = parameterArray["p1"];
if (request.Url.indexOf(this.QuickFilterText) != -1)
{
this.FilteredRequests.push(request);
this.redrawRequestTreePlusOne();
}
},
initFilteredRequests: function(requests)
{
for (var r in requests)
{
if (requests[r].Url.indexOf(this.QuickFilterText) != -1)
{
this.FilteredRequests.push(requests[r]);
this.redrawRequestTreePlusOne();
}
}
},
cmd_hf_toggleWatching: function()
{
if (this.HttpFoxService.IsWatching)
{
this.cmd_hf_stopWatching();
}
else
{
this.cmd_hf_startWatching();
}
},
//C BUTTON (on all controllers)
cmd_hf_startWatching: function()
{
if (!this.HttpFoxService.IsWatching)
{
this.HttpFoxService.startWatching();
}
this.HttpFoxService.callControllerMethod("disableButton_startWatching");
},
disableButton_startWatching: function()
{
document.getElementById("cmd_hf_startWatching").setAttribute('disabled', 'true');
document.getElementById("cmd_hf_stopWatching").removeAttribute('disabled');
},
//C BUTTON (on all controllers)
cmd_hf_stopWatching: function()
{
if (this.HttpFoxService.IsWatching)
{
this.HttpFoxService.stopWatching();
}
this.HttpFoxService.callControllerMethod("disableButton_stopWatching");
},
disableButton_stopWatching: function()
{
document.getElementById("cmd_hf_stopWatching").setAttribute('disabled', 'true');
document.getElementById("cmd_hf_startWatching").removeAttribute('disabled');
},
//C BUTTON (on all controllers)
cmd_hf_clear: function()
{
this.HttpFoxService.clearRequests();
this.HttpFoxService.callControllerMethod("clear");
},
cmd_hf_detach: function()
{
// switch to window if opened
if (this.switchToDetachedWindowIfOpened())
{
return;
}
// if not, open new one
this.OpenInWindow();
// close panel
this.closePanel();
// command checked
document.getElementById("cmd_hf_togglePanel").setAttribute("checked", true);
},
switchToDetachedWindowIfOpened: function()
{
var HttpFoxPanel = document.getElementById("hf_PanelNormal");
var HttpFoxPanelSplitter = document.getElementById("hf_PanelSplitter");
// if already opened detached, switch to opened window
if (this.HttpFoxService.HttpFoxWindow)
{
if (!HttpFoxPanel.collapsed)
{
// close open panel
HttpFoxPanelSplitter.collapsed = HttpFoxPanel.collapsed = true;
}
// window already open. switch to that
this.HttpFoxService.HttpFoxWindow.setFocus();
// command checked
document.getElementById("cmd_hf_togglePanel").setAttribute("checked", true);
return true;
}
return false;
},
closePanel: function()
{
var HttpFoxPanel = document.getElementById("hf_PanelNormal");
var HttpFoxPanelSplitter = document.getElementById("hf_PanelSplitter");
HttpFoxPanelSplitter.collapsed = HttpFoxPanel.collapsed = true;
},
windowIsClosed: function()
{
// command checked
document.getElementById("cmd_hf_togglePanel").setAttribute("checked", false);
},
togglePanel: function()
{
var HttpFoxPanel = document.getElementById("hf_PanelNormal");
var HttpFoxPanelSplitter = document.getElementById("hf_PanelSplitter");
// normal panel toggle
HttpFoxPanelSplitter.collapsed = HttpFoxPanel.collapsed = (HttpFoxPanel.collapsed) ? false : true;
// command checked
document.getElementById("cmd_hf_togglePanel").setAttribute("checked", !HttpFoxPanelSplitter.collapsed);
},
clear: function()
{
this.FilteredRequests = new Array();
this.clearRequestTree();
this.clearRequestInfoTabs();
},
//G
clearRequestTree: function()
{
var treeElement = document.getElementById("hf_RequestTree");
if (treeElement)
{
this.RequestTree = new HttpFoxTree(treeElement, this);
}
},
//G
clearRequestInfoTabs: function()
{
// clear headers
this.clearTreeEntries("hf_RequestHeadersChildren");
this.clearTreeEntries("hf_ResponseHeadersChildren");
// clear cookies
this.clearTreeEntries("hf_CookiesSentChildren");
this.clearTreeEntries("hf_CookiesReceivedChildren");
// clear cache info
//this.clearTreeEntries("hf_CacheInfoChildren");
// clear querystring
this.clearTreeEntries("hf_QueryStringChildren");
// clear postdata
this.clearTreeEntries("hf_PostDataChildren");
document.getElementById("hf_PostDataRawOutput").value = "";
// clear content
document.getElementById("hf_RawContentOutput").value = "";
// clear debug
var debugPanel = document.getElementById("hf_DebugOutput");
debugPanel.contentDocument.body.innerHTML = "";
},
//G
redrawRequestTreePlusOne: function()
{
this.RequestTree.invalidate();
var count = this.RequestTree.rowCount;
this.RequestTree.rowCountChanged(count, 1);
},
//G
redrawRequestTree: function()
{
this.RequestTree.invalidate();
},
//G
redrawRequestTreeRow: function(index)
{
if (typeof(index) == "object") {
index = index["p1"];
}
if (this.RequestTree.TreeElement.currentIndex == index)
{
this.redrawRequestDetails();
}
this.RequestTree.invalidateRow(index);
},
redrawRequestDetails: function()
{
this.selectionChange_RequestTree();
},
selectionChange_PostDataDisplayTypePretty: function()
{
this.PostDataViewMode = 0;
document.getElementById("hf_PostDataPrettyBox").collapsed = false;
document.getElementById("hf_PostDataRawBox").collapsed = true;
},
selectionChange_PostDataDisplayTypeRaw: function()
{
this.PostDataViewMode = 1;
document.getElementById("hf_PostDataPrettyBox").collapsed = true;
document.getElementById("hf_PostDataRawBox").collapsed = false;
},
selectionChange_ContentDisplayTypePretty: function()
{
if (document.getElementById("hf_ContentRadioPretty").disabled)
{
return;
}
this.ContentViewMode = 0;
document.getElementById("hf_PrettyContentOutput").collapsed = false;
document.getElementById("hf_RawContentOutput").collapsed = true;
},
selectionChange_ContentDisplayTypeRaw: function()
{
if (document.getElementById("hf_ContentRadioPretty").disabled)
{
return;
}
this.ContentViewMode = 1;
document.getElementById("hf_PrettyContentOutput").collapsed = true;
document.getElementById("hf_RawContentOutput").collapsed = false;
},
disableContentDisplayTypePrettyRadio: function()
{
document.getElementById("hf_ContentRadioGroup").selectedIndex = 1;
document.getElementById("hf_ContentRadioPretty").disabled = true;
document.getElementById("hf_ContentRadioGroup").disabled = true;
document.getElementById("hf_PrettyContentOutput").collapsed = true;
document.getElementById("hf_RawContentOutput").collapsed = false;
},
enableContentDisplayTypePrettyRadio: function()
{
document.getElementById("hf_ContentRadioGroup").selectedIndex = this.ContentViewMode;
document.getElementById("hf_ContentRadioPretty").disabled = false;
document.getElementById("hf_ContentRadioGroup").disabled = false;
if (this.ContentViewMode == 0)
{
this.selectionChange_ContentDisplayTypePretty();
}
else
{
this.selectionChange_ContentDisplayTypeRaw();
}
},
//G TABCLICK
selectionChange_RequestDetails: function()
{
try
{
this.SelectedRequestDetailsTab = document.getElementById("hf_RequestDetailsTabs").selectedIndex;
if (this.isSelectedTab_Debug() && !this.HttpFoxService.Preferences.ShowDebugTab)
{
document.getElementById("hf_RequestDetailsTabs").selectedIndex = 0;
}
var contentPanel = document.getElementById("hf_RawContentOutput");
var currentRequest = this.RequestTree.getCurrent();
if (currentRequest && this.isSelectedTab_Content())
{
if (currentRequest.isContentAvailable())
{
// async
this.showRawContentLoading();
currentRequest.startGetRawContent(this);
}
else
{
this.clearContentDisplay();
this.showRawContentNotAvailable();
}
//if (currentRequest.getCachedResponse()) {
// contentPanel.value = currentRequest.getRawContent();
//}
//else {
// contentPanel.value = "BUSY / PROBLEM";
//}
//contentPanel.value = currentRequest.getRawContent();
//contentPanel.value = currentRequest.getCachedResponse();
}
else
{
contentPanel.value = "";
}
var debugPanel = document.getElementById("hf_DebugOutput");
if (currentRequest && this.isSelectedTab_Debug())
{
debugPanel.contentDocument.body.innerHTML = this.getDebugInfoContent(currentRequest);
}
else
{
debugPanel.contentDocument.body.innerHTML = "";
}
}
catch(exc)
{}
},
//G
selectionChange_RequestTree: function()
{
var currentRequest = this.RequestTree.getCurrent();
// update debug
var debugPanel = document.getElementById("hf_DebugOutput");
if (this.isSelectedTab_Debug())
{
debugPanel.contentDocument.body.innerHTML = this.getDebugInfoContent(currentRequest);
}
else
{
debugPanel.contentDocument.body.innerHTML = "";
}
// update cookie info
this.showCookieInfo(currentRequest);
// update cache info
//this.showCacheInfo(currentRequest);
// update post data info
this.showPostData(currentRequest);
// update querystring info
this.showQueryStringParameters(currentRequest);
// headers
this.showRequestHeaders(currentRequest);
this.showResponseHeaders(currentRequest);
// update/get content
var contentPanel = document.getElementById("hf_RawContentOutput");
if (this.isSelectedTab_Content())
{
//net.decoded.utils.dumpall("curr-request", currentRequest);
//alert("avail.? ");
if (currentRequest.isContentAvailable()) {
// async
this.showRawContentLoading();
currentRequest.startGetRawContent(this);
/*if (currentRequest.getCachedResponse()) {
contentPanel.value = currentRequest.getRawContent();
}
else {
// one more time.
if (currentRequest.getCachedResponse()) {
contentPanel.value = currentRequest.getRawContent();
}
else {
contentPanel.value = "BUSY / PROBLEM (try again)";
}
}*/
}
else {
this.clearContentDisplay();
this.showRawContentNotAvailable();
}
//contentPanel.value = currentRequest.getRawContent();
}
else
{
contentPanel.value = "";
}
},
clearContentDisplay: function()
{
document.getElementById("hf_PrettyContentOutput").contentDocument.body.innerHTML = "";
document.getElementById("hf_RawContentOutput").value = "";
document.getElementById("hf_ContentTypeLabel").value = "Type: ";
this.disableContentDisplayTypePrettyRadio();
},
//G
showRawContent: function(status)
{
var currentRequest = this.RequestTree.getCurrent();
var contentPanelRaw = document.getElementById("hf_RawContentOutput");
var contentPanelPretty = document.getElementById("hf_PrettyContentOutput");
// clear first
this.clearContentDisplay();
// display content-type
document.getElementById("hf_ContentTypeLabel").value = "Type: " + (currentRequest.ContentType ? currentRequest.ContentType : "");
// not finished
if (status == -1)
{
// not finished
this.showRawContentNotFinished();
return;
}
// error at getting content
if (status > 0)
{
// error
this.showRawContentError(status);
return;
}
// fill raw content display
contentPanelRaw.value = currentRequest.Content;
// try to fill pretty print content
if (net.decoded.utils.isContentTypeXml(currentRequest.ContentType))
{
// enable pretty
this.enableContentDisplayTypePrettyRadio();
// xml (by mimetype definition)
this.getPrettyPrintXML(currentRequest.Content, "hf_PrettyContentOutput");
// display if selected view
if (this.ContentViewMode == 0)
{
this.selectionChange_ContentDisplayTypePretty();
}
return;
}
},
//G
showRawContentLoading: function()
{
this.clearContentDisplay();
document.getElementById("hf_RawContentOutput").value = "Loading...";
},
showRawContentError: function(status)
{
this.clearContentDisplay();
document.getElementById("hf_RawContentOutput").value = "Error loading content (" + net.decoded.utils.nsResultErrors[status.toString(16)] + ")";
},
showRawContentNotAvailable: function()
{
this.clearContentDisplay();
document.getElementById("hf_RawContentOutput").value = "Not available";
},
showRawContentNotFinished: function()
{
this.clearContentDisplay();
document.getElementById("hf_RawContentOutput").value = "Not ready...";
},
//G
isSelectedTab_Content: function()
{
if (this.SelectedRequestDetailsTab == 4)
{
return true;
}
return false;
},
//G
isSelectedTab_Debug: function()
{
if (this.SelectedRequestDetailsTab == 5)
{
return true;
}
return false;
},
//G
addHeaderRow: function(elementid, name, value)
{
var tree = document.getElementById(elementid);
var newRow = tree.appendChild(document.createElement('treeitem')).appendChild(document.createElement('treerow'));
newRow.appendChild(document.createElement('treecell')).setAttribute('label', name);
newRow.appendChild(document.createElement('treecell')).setAttribute('label', value);
},
//G
addCookieRow: function(elementid, name, value, path, domain, expires)
{
var tree = document.getElementById(elementid);
var newRow = tree.appendChild(document.createElement('treeitem')).appendChild(document.createElement('treerow'));
newRow.appendChild(document.createElement('treecell')).setAttribute('label', name);
newRow.appendChild(document.createElement('treecell')).setAttribute('label', value);
newRow.appendChild(document.createElement('treecell')).setAttribute('label', path);
newRow.appendChild(document.createElement('treecell')).setAttribute('label', domain);
newRow.appendChild(document.createElement('treecell')).setAttribute('label', expires);
},
//G
clearTreeEntries: function(elementid)
{
var tree = document.getElementById(elementid);
var items = tree.getElementsByTagName('treeitem');
while(items.length > 0)
{
tree.removeChild(items[0]);
}
},
//G
showRequestHeaders: function(request)
{
this.clearTreeEntries("hf_RequestHeadersChildren");
// request line
this.addHeaderRow("hf_RequestHeadersChildren", "(Request-Line)", request.RequestMethod + " " + request.URIPath + " HTTP/" + request.RequestProtocolVersion);
for (i in request.RequestHeaders)
{
this.addHeaderRow("hf_RequestHeadersChildren", i, request.RequestHeaders[i]);
}
for (i in request.PostDataHeaders)
{
this.addHeaderRow("hf_RequestHeadersChildren", i, request.PostDataHeaders[i]);
}
},
//G
showResponseHeaders: function(request)
{
this.clearTreeEntries("hf_ResponseHeadersChildren");
// response status and text
if (request.ResponseHeaders != null)
{
this.addHeaderRow("hf_ResponseHeadersChildren", "(Status-Line)", "HTTP/" + request.ResponseProtocolVersion + " " + request.ResponseStatus + " " + request.ResponseStatusText);
}
for (i in request.ResponseHeaders)
{
if (i == "Set-Cookie")
{
// split into original multiple header values
var setCookieHeaders = request.ResponseHeaders[i].split("\n");
for (u in setCookieHeaders)
{
this.addHeaderRow("hf_ResponseHeadersChildren", i, setCookieHeaders[u]);
}
}
else
{
this.addHeaderRow("hf_ResponseHeadersChildren", i, request.ResponseHeaders[i]);
}
}
},
//G
showQueryStringParameters: function(request)
{
this.clearTreeEntries("hf_QueryStringChildren");
if (request.QueryString == null)
{
this.addHeaderRow("hf_QueryStringChildren", "(none)", "(The URL does not contain a query string)");
return;
}
for (i in request.QueryStringParameters)
{
this.addHeaderRow("hf_QueryStringChildren", net.decoded.utils.urlDecode(request.QueryStringParameters[i][0]), net.decoded.utils.urlDecode(request.QueryStringParameters[i][1]));
}
},
//G
showCookieInfo: function(request)
{
this.clearTreeEntries("hf_CookiesSentChildren");
this.clearTreeEntries("hf_CookiesReceivedChildren");
if (request.CookiesSent == null && request.CookiesReceived == null)
{
// no cookies
return;
}
for (i in request.CookiesSent)
{
this.addCookieRow("hf_CookiesSentChildren", request.CookiesSent[i]["name"], request.CookiesSent[i]["value"], (request.CookiesSent[i]["path"]) ? request.CookiesSent[i]["path"] : "", (request.CookiesSent[i]["domain"]) ? request.CookiesSent[i]["domain"] : "", (request.CookiesSent[i]["expires"]) ? net.decoded.utils.formatDateTime(request.CookiesSent[i]["expires"]) : "End Of Session");
}
for (i in request.CookiesReceived)
{
this.addCookieRow("hf_CookiesReceivedChildren", request.CookiesReceived[i]["name"], request.CookiesReceived[i]["value"], request.CookiesReceived[i]["path"], (request.CookiesReceived[i]["domain"]) ? request.CookiesReceived[i]["domain"] : "", (request.CookiesReceived[i]["expires"]) ? request.CookiesReceived[i]["expires"] : "End Of Session");
}
},
//G
showCacheInfo: function(request)
{
this.clearTreeEntries("hf_CacheInfoChildren");
//TODO: REFACTOR
request.showCacheInfo();
},
//G
showPostData: function(request)
{
if (this.PostDataViewMode == 0)
{
this.selectionChange_PostDataDisplayTypePretty();
}
else
{
this.selectionChange_PostDataDisplayTypeRaw();
}
// init
document.getElementById("hf_PostDataPretty").collapsed = true;
document.getElementById("hf_PostDataTree").collapsed = false;
// fill raw data
if (request.IsPostDataTooBig)
{
document.getElementById("hf_PostDataRawOutput").value = "too big...";
}
else
{
document.getElementById("hf_PostDataRawOutput").value = request.PostData;
}
// fill pretty data
var mimeLabel = document.getElementById("hf_PostDataMimeType");
mimeLabel.value = "Type: ";
this.clearTreeEntries("hf_PostDataChildren");
if (request.PostData == null) {
this.addHeaderRow("hf_PostDataChildren", "(none)", "(This request contained no POST data)");
return;
}
var ctypedisplay = "";
for (var y in request.PostDataHeaders)
{
if (y.toLowerCase() == "content-type")
{
ctypedisplay = request.PostDataHeaders[y];
}
}
if (ctypedisplay == "")
{
for (var y in request.RequestHeaders)
{
if (y.toLowerCase() == "content-type")
{
ctypedisplay = request.RequestHeaders[y];
}
}
}
mimeLabel.value = "Type: " + ctypedisplay;
if (request.IsPostDataMIME)
{
// mime post data
for (i in request.PostDataMIMEParts)
{
if (request.PostDataMIMEParts[i]["filename"] != null)
{
this.addHeaderRow("hf_PostDataChildren",
request.PostDataMIMEParts[i]["varname"],
request.PostDataMIMEParts[i]["filename"] + " " + request.PostDataMIMEParts[i]["ctype"]);
}
else
{
this.addHeaderRow("hf_PostDataChildren", request.PostDataMIMEParts[i]["varname"], request.PostDataMIMEParts[i]["value"]);
}
}
}
else if (request.PostDataParameters)
{
// standard url encoded post data
for (i in request.PostDataParameters)
{
if (request.PostDataParameters[i][0] != null && request.PostDataParameters[i][0] != "")
{
this.addHeaderRow("hf_PostDataChildren", net.decoded.utils.urlDecode(request.PostDataParameters[i][0]), net.decoded.utils.urlDecode(request.PostDataParameters[i][1] != null ? request.PostDataParameters[i][1] : ""));
}
}
}
else
{
// raw content
document.getElementById("hf_PostDataPretty").collapsed = false;
document.getElementById("hf_PostDataTree").collapsed = true;
// check if url parameter style
if (net.decoded.utils.isXml(request.PostData))
{
this.getPrettyPrintXML(request.PostData, "hf_PostDataPretty");
}
else
{
// just raw...
document.getElementById("hf_PostDataPretty").contentDocument.body.innerHTML = request.PostData;
}
}
},
getPrettyPrintXML: function(xmlData, browserBoxId)
{
var parser = new DOMParser();
var doc = parser.parseFromString(xmlData, "text/xml");
var HTMLOutput = this.XMLPrettyPrintXSLT.transformToFragment(doc, document);
var debugPanel = document.getElementById(browserBoxId);
debugPanel.contentDocument.body.innerHTML = "";
var importedNode = debugPanel.contentDocument.importNode(HTMLOutput, true);
debugPanel.contentDocument.body.appendChild(importedNode);
debugPanel.contentDocument.body.style.margin = 0;
debugPanel.contentDocument.body.style.padding = 0;
},
//G
showDebugInfo: function(request)
{
var debugPanel = document.getElementById("hf_DebugOutput");
debugPanel.contentDocument.body.innerHTML = this.getDebugInfoContent(request);
},
getDebugInfoContent: function(request)
{
var content = "";
content = "<div style=\"font-family:Tahoma,Verdana,Arial,sans-serif; font-size:11px;\">";
content += "<b>Url:</b> " + request.Url + "<br/>";
content += "<b>RequestMethod:</b> " + request.RequestMethod + "<br/>";
content += "<b>StartTimestamp:</b> " + request.StartTimestamp + "<br/>";
content += "<b>EndTimestamp:</b> " + request.EndTimestamp + "<br/>";
content += "<b>Loadflags: - request:</b> " + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.LOADFLAGS_REQUEST, request.LoadFlags) + " (" + request.LoadFlags + ") <br/>";
content += "<b>Loadflags: - channel:</b> " + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.LOADFLAGS_CHANNEL, request.LoadFlags) + " (" + request.LoadFlags + ") <br/>";
content += "<b>Loadflags: - caching:</b> " + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.LOADFLAGS_CACHING, request.LoadFlags) + " (" + request.LoadFlags + ") <br/>";
content += "<b>IsFromCache:</b> " + request.IsFromCache + "<br/>";
content += "<b>BytesLoaded:</b> " + request.BytesLoaded + "<br/>";
content += "<b>BytesLoadedTotal:</b> " + request.BytesLoadedTotal + "<br/>";
content += "<b>ContentLength: </b>" + request.ContentLength + "<br/>";
content += "<b>ContentType: </b>" + request.ContentType + "<br/>";
content += "<b>ContentCharset: </b>" + request.ContentCharset + "<br/>";
content += "<b>ResponseStatus: </b>" + request.ResponseStatus + "<br/>";
content += "<b>ResponseStatusText: </b>" + request.ResponseStatusText + "<br/>";
if (request.IsFromCache) {
content += "<br/>";
content += "<b>CacheToken:</b> " + request.CacheToken + "<br/>";
content += "<b>CacheKey:</b> " + request.CacheKey + "<br/>";
content += "<b>CacheAsFile:</b> " + request.CacheAsFile + "<br/>";
content += "<b>CacheFile:</b> " + request.CacheFile + "<br/>";
}
// headers
for (i in request.RequestHeaders)
{
content += "<br/>";
content += "<b>Request header:</b> " + i + " : " + request.RequestHeaders[i];
}
for (i in request.ResponseHeaders)
{
content += "<br/>";
content += "<b>Response header:</b> " + i + " : " + request.ResponseHeaders[i];
}
content += "<br/>";
for (i in request.RequestLog)
{
content += "<br/>";
content += "-> <b>EventLog " + i + ":</b> <br/>";
content += "-------------------------------------------------------------------------<br/>";
content += "<b> - Url: </b>" + request.RequestLog[i].Url + "<br/>";
content += "<b> - ChannelStatus: </b>" + request.RequestLog[i].Status + "<br/>";
content += "<b> - Statuscode: </b>" + request.RequestLog[i].ResponseStatus + "<br/>";
content += "<b> - Timestamp: </b>" + request.RequestLog[i].Timestamp + "<br/>";
content += "<b> - HttpFox starttime: </b>" + request.HttpFox.StartTime + "<br/>";
//content += "- relative timestamp: " + net.decoded.utils.formatTime(new Date(this.RequestLog[i].Timestamp.getTime() - this.HttpFox.StartTime.getTime())) + "<br/>";
content += "<b> - IsFromCache: </b>" + request.RequestLog[i].IsFromCache + "<br/>";
content += "<b> - IsPending: </b>" + request.RequestLog[i].IsPending + "<br/>";
content += "<b> - BytesLoaded: </b>" + request.RequestLog[i].BytesLoaded + "<br/>";
content += "<b> - BytesLoadedTotal: </b>" + request.RequestLog[i].BytesLoadedTotal + "<br/>";
content += "<b> - ContentLength: </b>" + request.RequestLog[i].ContentLength + "<br/>";
content += "<b> - ContentType: </b>" + request.RequestLog[i].ContentType + "<br/>";
content += "<b> - ContentCharset: </b>" + request.RequestLog[i].ContentCharset + "<br/>";
content += "<b> - EventSource: </b>" + this.HttpFoxService.getEventSourceName(request.RequestLog[i].EventSource) + "<br/>";
content += "<b> - EventSourceData: </b><br/>";
for (u in request.RequestLog[i].EventSourceData)
{
if ((request.RequestLog[i].EventSource == this.HttpFoxService.HttpFoxEventSourceType.EVENTSINK_ON_STATUS ||
request.RequestLog[i].EventSource == this.HttpFoxService.HttpFoxEventSourceType.WEBPROGRESS_ON_STATUS_CHANGED)
&& u == "status")
{
content += "<b> -- " + u + ": </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.SOCKETTRANSPORT, request.RequestLog[i].EventSourceData[u]) + "<br/>";
}
else if (request.RequestLog[i].EventSource == this.HttpFoxService.HttpFoxEventSourceType.WEBPROGRESS_ON_SECURITY_CHANGED && u == "state")
{
content += "<b> -- " + u + " - security: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_SECURITY, request.RequestLog[i].EventSourceData[u]) + "<br/>";
content += "<b> -- " + u + " - strength: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_SECURITY_STRENGTH, request.RequestLog[i].EventSourceData[u]) + "<br/>";
}
else if (request.RequestLog[i].EventSource == this.HttpFoxService.HttpFoxEventSourceType.WEBPROGRESS_ON_STATE_CHANGED && u == "flags")
{
content += "<b> -- " + u + " - transition: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_TRANSITION, request.RequestLog[i].EventSourceData[u]) + "<br/>";
content += "<b> -- " + u + " - type: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_TYPE, request.RequestLog[i].EventSourceData[u]) + "<br/>";
content += "<b> -- " + u + " - modifier: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_MODIFIER, request.RequestLog[i].EventSourceData[u]) + "<br/>";
content += "<b> -- " + u + " - security: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_SECURITY, request.RequestLog[i].EventSourceData[u]) + "<br/>";
content += "<b> -- " + u + " - strength: </b>" + this.HttpFoxService.getStatusTextFromCode(this.HttpFoxService.HttpFoxStatusCodeType.WEBPROGRESS_SECURITY_STRENGTH, request.RequestLog[i].EventSourceData[u]) + "<br/>";
}
else if (request.RequestLog[i].EventSource == this.HttpFoxService.HttpFoxEventSourceType.WEBPROGRESS_ON_LOCATION_CHANGED && u == "uri")
{
content += "<b> -- " + u + ": </b>" + request.RequestLog[i].EventSourceData[u].asciiSpec + "<br/>";
}
else
{
content += "<b> -- " + u + ": </b>" + request.RequestLog[i].EventSourceData[u] + "<br/>";
}
}
content += "<br/>";
}
content += "</div>";
return content;
},
//G
getCurrentInfoTreeElement: function()
{
switch(this.SelectedRequestDetailsTab)
{
case 0:
return "hf_RequestHeadersTree" + ";" + "hf_ResponseHeadersTree";
case 1:
return "hf_CookiesSentTree" + ";" + "hf_CookiesReceivedTree";
//case 2:
//return "hf_CacheInfoTree";
case 2:
return "hf_QueryStringTree";
case 3:
return "hf_PostDataTree";
default:
return "";
}
},
//G
// context menu stuff
updateRequestContextMenu: function(event)
{
var row = {};
var column = {};
var part = {};
if (event.currentTarget.id == "hf_RequestTreeContextMenu")
{
var tree = this.RequestTree.TreeElement;
var boxobject = tree.boxObject;
var menu = document.getElementById("hf_RequestTreeContextMenu");
boxobject.QueryInterface(Components.interfaces.nsITreeBoxObject);
boxobject.getCellAt(event.clientX, event.clientY, row, column, part);
}
else
{
var infoTreeIds = this.getCurrentInfoTreeElement().split(";");
var tree;
var boxobject;
var menu = document.getElementById("hf_RequestDetailsContextMenu");
for (i in infoTreeIds)
{
row = {};
column = {};
tree = document.getElementById(infoTreeIds[i]);
boxobject = tree.boxObject;
boxobject.QueryInterface(Components.interfaces.nsITreeBoxObject);
boxobject.getCellAt(event.clientX, event.clientY, row, column, part);
if (column.value != null) {
// tree found
break;
}
}
}
// set current tree
this.currentContextTree = tree;
if (column.value != null)
{
// column and row found. show those two entries
var celltext = tree.view.getCellText(row.value, tree.columns.getColumnAt(column.value.index));
this.currentCellText = celltext;
// copy cell
menu.firstChild.setAttribute("hidden" , false);
menu.firstChild.setAttribute("disabled", false);
menu.firstChild.setAttribute("label", "Copy '"+ celltext + "'");
// copy row
menu.firstChild.nextSibling.setAttribute("hidden" , false);
menu.firstChild.nextSibling.setAttribute("disabled", false);
}
else
{
//just show copy all rows
this.currentCellText = null;
// hide copy cell
menu.firstChild.setAttribute("hidden" , true);
menu.firstChild.setAttribute("disabled", true);
// hide copy row
menu.firstChild.nextSibling.setAttribute("hidden" , true);
menu.firstChild.nextSibling.setAttribute("disabled", true);
}
},
//G
Clipboard_CopyTreeRowCell: function()
{
if (this.currentCellText != null)
{
net.decoded.utils.toClipboard(this.currentCellText);
}
},
//G
Clipboard_CopyTreeRow: function()
{
if (this.currentContextTree != null)
{
var copyString = "";
for (var i = 0; i < this.currentContextTree.columns.count; i++)
{
copyString += this.currentContextTree.view.getCellText(this.currentContextTree.currentIndex, this.currentContextTree.columns.getColumnAt(i));
if (i < this.currentContextTree.columns.count - 1)
{
copyString += "\t";
}
}
net.decoded.utils.toClipboard(copyString);
}
},
//G
Clipboard_CopyTreeAllRows: function()
{
if (this.currentContextTree != null)
{
var copyString = "";
var rowCount = this.currentContextTree.view.rowCount;
for (var u = 0; u < rowCount; u++)
{
for (var i = 0; i < this.currentContextTree.columns.count; i++)
{
copyString += this.currentContextTree.view.getCellText(u, this.currentContextTree.columns.getColumnAt(i));
if (i < this.currentContextTree.columns.count - 1)
{
copyString += "\t";
}
}
if (u < rowCount - 1)
{
copyString += "\n";
}
}
net.decoded.utils.toClipboard(copyString);
}
},
//G
OpenInWindow: function()
{
net.decoded.utils.openWindow("HttpFox", "chrome://httpfox/content/HttpFoxWindow.xul", "", null);
},
OpenOptions: function()
{
openDialog("chrome://httpfox/content/HttpFoxOptions.xul", "HttpFox Options", "", null);
}
}
var HttpFox = new HttpFoxController();
function shutdownHttpFox()
{
HttpFox.clear();
//HttpFox.cmd_stopWatching();
HttpFox.HttpFoxService.removeController(HttpFox);
if (HttpFox.WindowMode)
{
HttpFox.HttpFoxService.HttpFoxWindow = null;
HttpFox.HttpFoxService.windowIsClosed();
}
HttpFox = null;
}